#include <regx52.h>
#include "1_Wire.h"
#include "LCD1602.h"

/**
 * @brief 初始化并启动DS18B20温度传感器的温度转换过程。
 *
 * 该函数会向DS18B20发送命令，启动温度转换并使其准备好返回温度值。
 *
 * @return 无
 */
void DS18B20_Temp()
{
    WireInit();       // 初始化OneWire总线
    WireWrite(0xCC);  // 发送跳过ROM命令，选择设备
    WireWrite(0x44);  // 发送开始温度转换命令
}

/**
 * @brief 从DS18B20读取温度值。
 *
 * 该函数会从DS18B20读取温度数据并转换为实际的温度值（单位为摄氏度）。
 *
 * @return 返回温度值（单位：°C）
 */
float DS18B20_ReadTemp()
{
    unsigned char LSB = 0, MSB = 0;  // 存储温度的低字节和高字节
    int temp = 0;  // 用于存储温度值的整数变量
    float T = 0;   // 最终的温度值

    WireInit();       // 初始化OneWire总线
    WireWrite(0xCC);  // 发送跳过ROM命令，选择设备
    WireWrite(0xBE);  // 发送读取温度命令
    
    LSB = WireRead();  // 读取低字节
    MSB = WireRead();  // 读取高字节
    
    temp = (MSB << 8) + LSB;  // 合并低字节和高字节得到16位的温度值
    
    // 如果是负温度（符号位），则进行补码处理
    if (MSB & 0x10)  
    {
        temp |= 0x0FFF;  // 补码处理
    }

    T = temp / 16.0;  // 转换为实际温度值（单位：°C）
    
    return T;  // 返回温度值
}


//标准

// while(1)
// 	{
// 		DS18B20_Temp();		//转换温度
// 		T=DS18B20_ReadTemp();	//读取温度
// 		if(T<0)				//如果温度小于0
// 		{
// 			LCD_ShowChar(2,1,'-');	//显示负号
// 			T=-T;			//将温度变为正数
// 		}
// 		else				//如果温度大于等于0
// 		{
// 			LCD_ShowChar(2,1,'+');	//显示正号
// 		}
// 		LCD_ShowNum(2,2,T,3);		//显示温度整数部分
// 		LCD_ShowChar(2,5,'.');		//显示小数点
// 		LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//(T*10000)显示温度的整数与小数部分超过65536，所以定义为unsigned long//%10000求的是最后4位

//     }